#ifndef _DS18B20_H_
#define _DS18B20_H_

#include <stdio.h>
#include <string.h>
#include <stdint.h>
#include <stdint.h>

/* DS18B20控制IO操作函数 */
typedef void (*DS18B20_out_callback)(int sta);
typedef int (*DS18B20_in_callback)(void);

/* DS18B20控制IO模式配置 */
typedef void (*DS18B20_OutPut_Mode_callback)(void);
typedef void (*DS18B20_InPut_Mode_callback)(void);

/* DS18B20 us 级延时函数 */
typedef void (*DS18B20_delay_us_callback)(uint32_t us);

typedef struct DS18B20_init {
	DS18B20_in_callback in_cb;
	DS18B20_out_callback out_cb;
	DS18B20_InPut_Mode_callback in_mode_cb;
	DS18B20_OutPut_Mode_callback out_mode_cb;
	DS18B20_delay_us_callback delay_us_cb;
} DS18B20_init_t;

typedef enum DS18B20_Resolution{
	DS18B20_9BIT = 0X1F,
	DS18B20_10BIT = 0X3F,
	DS18B20_11BIT = 0X5F,
	DS18B20_12BIT = 0X7F,
} DS18B20_Resolution_e;

/**
  * @brief    DS18B20精度配置,默认12Bit精度
  * @param    none
  * @retval   0:OK, -1 failed
*/
int DS18B20_Resolution_Config(DS18B20_Resolution_e resolution);

/**
  * @brief    DS18B20初始化
  * @param    none
  * @retval   0:OK, -1 or -2 fail
*/
int DS18B20_Init(DS18B20_init_t init_cb);

/**
  * @brief    从DS18B20读取一次数据
  * @param[out] temp_o 读取到的温度数据
  * @retval   0: Read success; <0:读取错误
  * @note     适用于总线上只有一个DS18B20的情况
*/
int DS18B20_Read_Temperature(float *temp_o);
 
#endif /* _DS18B20_H_ */
